﻿using System;
using System.Collections.Generic;
using System.Diagnostics.Contracts;

namespace IMModel.Domain.Common
{
    /// <summary>
    /// Определяет типы, которые могут кэшировать своё вычисленное состояние
    /// </summary>
    public interface ICacheble
    {
        /// <summary>
        /// Обявляет недействительным вычисленное ранее состояние объекта
        /// </summary>
        void Invalidate();
    }    


    /// <summary>
    /// Класс-расширение для кэшируемых объектов
    /// </summary>
    public static class CachebleCollectionInvalidate
    {
        /// <summary>
        /// Объявляет недействительными все кэшируемые элементы списка
        /// </summary>
        /// <typeparam name="T">Тип элемента</typeparam>
        /// <param name="source">Список</param>
        /// <exception cref="ArgumentNullException"/>
        public static void Invalidate<T>(this IEnumerable<T> source) where T:ICacheble
        {
            Contract.Requires(source != null);
            if (source == null) throw new ArgumentNullException("source", "Параметр source не может быть null.");

            foreach (ICacheble item in source)
            {
                item.Invalidate();
            }
        }
    }
}
